203. 移除链表元素

203. 移除链表元素

题目链接
代码随想录

分析

如果要移除的节点是头节点,其操作跟要移除的节点是非头节点的时候不一样,很容易就想到,我们可以加一个虚拟头节点,然后统一移除操作。最后返回的时候,只返回虚拟节点的下一个节点即可,代码写出来非常优雅。
此外我们要注意,要移除一个节点,得确定这个节点的前一个节点。只有确定了待删除节点的前一个节点,我们才可以通过跳过这个节点的子节点的方式删除目标节点。因此,思路就出来了。
这里还有一个需要注意的地方,就是,如果下一个节点就是要删除的节点假设是 A1,删除之后,新的下一个节点是 A2,此时,我们还得继续检查 A2,因为 A2 可能也是要删除的节点。也就是说此时不要移动当前指针指向的节点。而如果下一个节点不是,那么就可以移动当前指针指向的节点。

解题

public ListNode removeElements(ListNode head, int val) {
    ListNode dummyHead = new ListNode();
    dummyHead.next = head;
    ListNode nowNode = dummyHead;
    while (nowNode != null && nowNode.next != null) {
        ListNode nextNode = nowNode.next;
        if (nextNode.val == val) {
            // 删除节点 nextNode,但是不更新 nowNode
            nowNode.next = nextNode.next;
        }else{
            nowNode = nowNode.next;
        }
    }
    return dummyHead.next;

}

相关题